/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siagefi.mb;

import br.com.caelum.stella.bean.validation.CNPJ;
import br.com.caelum.stella.bean.validation.CPF;
import br.siagefi.enuns.UnidadesFederativas;
import br.siagefi.model.FornecedorPF;
import br.siagefi.model.FornecedorPJ;
import br.siagefi.service.FornecedorPFService;
import br.siagefi.service.FornecedorPJService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author NOTE
 */
@ManagedBean
@SessionScoped
public class FornecedorBean implements Serializable {

    private FornecedorPF fornecedorPF;
    private FornecedorPJ fornecedorPJ;
    private List<FornecedorPF> fornecedoresPF;
    private List<FornecedorPJ> fornecedoresPJ;
    private final FornecedorPFService servicePF;
    private final FornecedorPJService servicePJ;
    private String tipoPessoa;
    
    @CPF(message = "CPF invalido!")
    private String cpf;
    
    @CNPJ(message = "CNPJ Invalido!")
    private String cnpj;

    public FornecedorBean() {
        this.servicePF = new FornecedorPFService();
        this.servicePJ = new FornecedorPJService();
        this.fornecedoresPF = new ArrayList<>();
        this.fornecedoresPJ = new ArrayList<>();
        this.fornecedorPF = new FornecedorPF();
        this.fornecedorPJ = new FornecedorPJ();
    }  
    
    // navegação
    
    //Template
    public String gerenciarFornecedor(){
         FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("fornecedorBean");
        return"/pages/users/operador/fornecedor";
    }
    
    public String novo() {
        if(this.getTipoPessoa().equals("PJ")){
            if(this.getCnpj().isEmpty()){
                FacesUtil.addErrorMessage("O 'CNPJ' deve ser informado!");
                return "Fornecedor";
            } else{
                this.getFornecedorPJ().setCnpj(this.getCnpj());
            }
            if (servicePJ.jaExiste(this.getFornecedorPJ())) {
                FacesUtil.addErrorMessage("Fornecedor já cadastrado anteriormente!");
                return "fornecedor";
            }
            return "incluirFornecedorPJ";
        } else {
            if(this.getTipoPessoa().equals("PF")){
                if(this.getCpf().isEmpty()){
                    FacesUtil.addErrorMessage("O 'CPF' deve ser informado!");
                    return "fornecedor";
                }else{
                    this.getFornecedorPF().setCpf(this.getCpf());
                }
                if (servicePF.jaExiste(this.getFornecedorPF())) {
                    FacesUtil.addErrorMessage("Fornecedor já cadastrado anteriormente!");
                    return "fornecedor";
                } 
                return "incluirFornecedorPF";
            } else {
              this.limpar();
              FacesUtil.addErrorMessage("Selecione o tipo de pessoa!");
              return "fornecedor";
            }
        }
    }
    
    public String alterarFornecedorPJ(FornecedorPJ fornecedorPJ) {
            this.setFornecedorPJ(fornecedorPJ);
            return "consultarFornecedorPJ";
    }
    
    public String alterarFornecedorPF(FornecedorPF fornecedorPF) {
            this.setFornecedorPF(fornecedorPF);
            return "consultarFornecedorPF";
    }
    
    public String voltarParaFornecedor(){
        this.limpar();
        return "fornecedor";
    }
    
    public String limpar(){
        this.setTipoPessoa(new String());
        this.setCpf(new String());
        this.setCnpj(new String());
        this.setFornecedorPF(new FornecedorPF());
        this.setFornecedorPJ(new FornecedorPJ());
        this.setFornecedoresPF(new ArrayList<FornecedorPF>());
        this.setFornecedoresPJ(new ArrayList<FornecedorPJ>());
        return "fornecedor";
    }
    
    public String limparFornecedor(){
        this.setCpf(new String());
        this.setCnpj(new String());
        this.setFornecedorPF(new FornecedorPF());
        this.setFornecedorPJ(new FornecedorPJ());
        this.setFornecedoresPF(new ArrayList<FornecedorPF>());
        this.setFornecedoresPJ(new ArrayList<FornecedorPJ>());
        return "fornecedor";
    }
   
    public String encerrar(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("ManagerBean");  
        return "/pages/users/index";
    }

    // persistência
    
    public String gravarFornecedorPJ() {
        if (this.getFornecedorPJ().getId() == null) {
            //incluir
            System.out.println("Incluir novo Fornecedor PJ");
            if (servicePJ.jaExiste(this.getFornecedorPJ())) {
                FacesUtil.addErrorMessage("Fornecedor já cadastrado anteriormente!");
            } else {
                servicePJ.inserir(this.getFornecedorPJ());
                FacesUtil.addSuccessMessage("Fornecedor cadastrado com sucesso!");
            }
        } else {
            //alterar
            System.out.println("Alterar Fornecedor PJ");
            servicePJ.alterar(this.getFornecedorPJ());
            FacesUtil.addSuccessMessage("Fornecedor alterado com sucesso!");
        }
        this.limpar();
        return "fornecedor";
    }
    
    public String gravarFornecedorPF() {
        if (this.getFornecedorPF().getId() == null) {
            //incluir
            System.out.println("Incluir novo Fornecedor PF");
            if (servicePF.jaExiste(this.getFornecedorPF())) {
                FacesUtil.addErrorMessage("Fornecedor já cadastrado anteriormente!");
            } else {
                System.out.println("Alterar Fornecedor PF");
                servicePF.inserir(this.getFornecedorPF());
                FacesUtil.addSuccessMessage("Fornecedor cadastrado com sucesso!");
            }
        } else {
            //alterar
            servicePF.alterar(this.getFornecedorPF());
            FacesUtil.addSuccessMessage("Fornecedor alterado com sucesso!");
        }
        this.limpar();
        return "fornecedor";
    }

    
    public String removerFornecedorPJ(FornecedorPJ fornecedorPJ) {
        if (servicePJ.existeDocumentoVinculado(fornecedorPJ)) {
            FacesUtil.addErrorMessage("Fornecedor possui documentos vinculados. Exclusão não permitida!");
            return "fornecedor";
        }
        System.out.println(fornecedorPJ.getNome());
        servicePJ.remover(fornecedorPJ);
        this.limpar();
        FacesUtil.addSuccessMessage("Dados excluidos com sucesso!");
        
        return "fornecedor";
    }
        
    public String removerFornecedorPF(FornecedorPF fornecedorPF) {
        if (servicePF.existeDocumentoVinculado(fornecedorPF)) {
            FacesUtil.addErrorMessage("Fornecedor possui documentos vinculados. Exclusão não permitida!");
            return "fornecedor";
        }
        System.out.println(fornecedorPF.getNome());
        servicePF.remover(fornecedorPF);
        this.limpar();
        FacesUtil.addSuccessMessage("Dados excluidos com sucesso!");
        return "fornecedor";
    }
    
    public String consultar (){
        System.out.println(this.getTipoPessoa());
        if(this.getTipoPessoa().equals("PJ")){
            if(this.getCnpj().isEmpty()){
                FacesUtil.addErrorMessage("O 'CNPJ' deve ser informado!");
                return "Fornecedor";
            }
            this.consultaPorCNPJ(this.getCnpj());
            if(this.getFornecedorPJ() == null){
                FacesUtil.addErrorMessage("Não foram localizados fornecedores para o tipo de pesquisa.");
            }else {
                return "consultarFornecedorPJ";
            }
        }
        if(this.getTipoPessoa().equals("PF")){
            if(this.getCpf().isEmpty()){
                FacesUtil.addErrorMessage("O 'CPF' deve ser informado!");
                return "Fornecedor";
            }
            this.consultaPorCPF(this.getCpf());
            if(this.getFornecedorPF() == null){
                FacesUtil.addErrorMessage("Não foram localizados fornecedores para o tipo de pesquisa.");
            }else {
                return "consultarFornecedorPF";
            }
        }
        if(this.getTipoPessoa() == null){
            FacesUtil.addErrorMessage("Informe o tipo de pessoa e o CPF ou CNPJ.");
        }
        return "fornecedor";
    }
    
    public void consultaPorCPF(String cpf){
        this.setFornecedorPF(servicePF.listarPorCPF(cpf));
    }
    
    public void consultaPorCNPJ(String cnpj){
        this.setFornecedorPJ(servicePJ.listarPorCNPJ(cnpj));
    }
    
    public String listarFornecedores(){
        this.limparFornecedor();
        if(this.getTipoPessoa().equals("PJ")){
           this.setFornecedoresPJ(servicePJ.listar());
           if(this.getFornecedoresPJ().isEmpty()){
               FacesUtil.addErrorMessage("Não foram localizados fornecedors para o tipo de pesquisa!");
           }
        }
        if(this.getTipoPessoa().equals("PF")){
            this.setFornecedoresPF(servicePF.listar());
            if(this.getFornecedoresPF().isEmpty()){
               FacesUtil.addErrorMessage("Não foram localizados fornecedors para o tipo de pesquisa!");
           }
        }
        return "fornecedor";
    }
    
    // listas e outros dados
    
    public List<UnidadesFederativas> getUnidadesFederativas() {
        return Arrays.asList(UnidadesFederativas.values());
    }
    
    //getters e setters

    public FornecedorPF getFornecedorPF() {
        return fornecedorPF;
    }

    public void setFornecedorPF(FornecedorPF fornecedorPF) {
        this.fornecedorPF = fornecedorPF;
    }

    public FornecedorPJ getFornecedorPJ() {
        return fornecedorPJ;
    }

    public void setFornecedorPJ(FornecedorPJ fornecedorPJ) {
        this.fornecedorPJ = fornecedorPJ;
    }

    public List<FornecedorPF> getFornecedoresPF() {
        return fornecedoresPF;
    }

    public void setFornecedoresPF(List<FornecedorPF> fornecedoresPF) {
        this.fornecedoresPF = fornecedoresPF;
    }

    public List<FornecedorPJ> getFornecedoresPJ() {
        return fornecedoresPJ;
    }

    public void setFornecedoresPJ(List<FornecedorPJ> fornecedoresPJ) {
        this.fornecedoresPJ = fornecedoresPJ;
    }

    public String getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(String tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getCnpj() {
        return cnpj;
    }

    public void setCnpj(String cnpj) {
        this.cnpj = cnpj;
    }

}
